package org.footballmanager.pandafootball.system.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import lombok.extern.slf4j.Slf4j;
import org.footballmanager.pandafootball.common.constants.Constants;
import org.footballmanager.pandafootball.system.domain.FootBfinfo;
import org.footballmanager.pandafootball.system.domain.FootUser;
import org.footballmanager.pandafootball.system.domain.FootYys;
import org.footballmanager.pandafootball.system.form.impl.FootYysSearchForm;
import org.footballmanager.pandafootball.system.mapper.FootYysMapper;
import org.footballmanager.pandafootball.system.service.FootYysService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import tk.mybatis.mapper.entity.Example;

import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;
import java.util.Collections;
import java.util.List;

@Slf4j
@Service
public class FootYysServiceImpl extends ServiceImpl<FootYys> implements FootYysService {
    @Autowired
    private FootYysMapper footYysMapper;

    /**
     * 获取热身赛积分榜
     *
     * @return 热身赛积分榜
     */
    @Override
    public List<FootYys> getJfb() {
        Example example = new Example(FootYys.class);
        example.createCriteria().andEqualTo("delFlag", 0);
        example.orderBy("jf").desc().orderBy("sl").desc().orderBy("s").desc();
        List<FootYys> list = findall(example);
        if (list != null && !list.isEmpty()) {
            return list;
        }
        return Collections.emptyList();
    }

    /**
     * 设置热身赛数据
     *
     * @param bf      报分实体类
     * @param issf    胜负
     * @param request 请求
     */
    @Override
    @Transactional
    public void setYysData(FootBfinfo bf, boolean issf, HttpServletRequest request) {
        FootYys zhuyys = findYysByUserId(bf.getQd1());
        FootYys keyys = findYysByUserId(bf.getQd2());
        if (issf) {
            zhuyys.setBscc(zhuyys.getBscc() + 1);
            keyys.setBscc(keyys.getBscc() + 1);

            if (bf.getJq1() == 2) {
                zhuyys.setS(zhuyys.getS() + 1);
                zhuyys.setJf(zhuyys.getJf() + 3);

                keyys.setF(keyys.getF() + 1);
                keyys.setJf(keyys.getJf());
            } else if (bf.getJq1() == 1) {
                zhuyys.setP(zhuyys.getP() + 1);
                zhuyys.setJf(zhuyys.getJf() + 1);

                keyys.setP(keyys.getP() + 1);
                keyys.setJf(keyys.getJf() + 1);
            } else {
                zhuyys.setF(zhuyys.getF() + 1);
                zhuyys.setJf(zhuyys.getJf());

                keyys.setS(keyys.getS() + 1);
                keyys.setJf(keyys.getJf() + 3);
            }
        } else {
            zhuyys.setBscc(zhuyys.getBscc() - 1);
            keyys.setBscc(keyys.getBscc() - 1);
            if (bf.getJq1() == 2) {
                zhuyys.setS(zhuyys.getS() - 1);
                zhuyys.setJf(zhuyys.getJf() - 3);
                keyys.setF(keyys.getF() - 1);
                keyys.setJf(keyys.getJf());
            } else if (bf.getJq1() == 1) {
                zhuyys.setP(zhuyys.getP() - 1);
                zhuyys.setJf(zhuyys.getJf() - 1);

                keyys.setP(keyys.getP() - 1);
                keyys.setJf(keyys.getJf() - 1);
            } else {
                zhuyys.setF(zhuyys.getF() - 1);
                zhuyys.setJf(zhuyys.getJf());

                keyys.setS(keyys.getS() - 1);
                keyys.setJf(keyys.getJf() - 3);
            }
        }
        if (!zhuyys.getBscc().equals(0)) {
            Double sl = zhuyys.getS().doubleValue() / zhuyys.getBscc().doubleValue();
            zhuyys.setSl(sl);
        } else {
            zhuyys.setSl(0D);
        }
        if (!keyys.getBscc().equals(0)) {
            Double sl2 = keyys.getS().doubleValue() / keyys.getBscc().doubleValue();
            keyys.setSl(sl2);
        } else {
            keyys.setSl(0D);
        }
        this.updateNotNull(zhuyys, request);
        this.updateNotNull(keyys, request);
    }

    /**
     * 获取热身赛top10
     *
     * @return 热身赛top10
     */
    @Override
    public List<FootYys> findYysTop10() {
        return footYysMapper.findYysTop10();
    }

    /**
     * 根据用户主键修改热身赛信用度
     *
     * @param userId  用户主键
     * @param credit  信用度
     * @param request 请求
     */
    @Override
    public void addCreditByUserId(Long userId, double credit, HttpServletRequest request) {
        FootYys yys = findYysByUserId(userId);
        if (yys != null) {
            yys.setXyd(null == yys.getXyd() ? 1 : yys.getXyd() + credit);
            this.updateNotNull(yys, request);
        }
    }

    /**
     * 保存新的热身赛到数据库
     *
     * @param user    用户实体类
     * @param request 请求
     */
    @Override
    public void saveNewYys(FootUser user, HttpServletRequest request) {
        FootYys yys = new FootYys();
        yys.setUserId(user.getId());
        this.save(yys, request);
    }

    /**
     * 根据用户主键查找热身赛记录
     *
     * @param userId 用户主键
     * @return 热身赛记录
     */
    @Override
    public FootYys findYysByUserId(Long userId) {
        Example example = new Example(FootYys.class);
        Example.Criteria criteria = example.createCriteria();
        criteria.andEqualTo(Constants.USERID, userId);
        criteria.andEqualTo("delFlag", 0);
        return this.findByExample(example);
    }

    /**
     * 翻页方法
     *
     * @param footYysSearchForm 条件
     * @return 列表
     */
    @Override
    public List<FootYys> findall(FootYysSearchForm footYysSearchForm) {
        return footYysMapper.findall(footYysSearchForm);
    }

    /**
     * 根据主键获取记录
     *
     * @param id 主键
     * @return 记录
     */
    @Override
    public FootYys get(Serializable id) {
        return footYysMapper.findById(id);
    }

    /**
     * 查询
     *
     * @param entityname        实体类名
     * @param map               参数
     * @param footYysSearchForm 条件
     */
    @Override
    public void search(String entityname, Model map, FootYysSearchForm footYysSearchForm) {
        map.addAttribute(String.format(Constants.FORMNAME, entityname), footYysSearchForm);
        Page<FootYys> page = PageHelper.startPage(footYysSearchForm.getPageIndex(), footYysSearchForm.getPageSize());
        List<FootYys> list = this.findall(footYysSearchForm);
        map.addAttribute(Constants.PI, page.toPageInfo());
        map.addAttribute(String.format(Constants.LISTENTITY, entityname), list);
    }

    /**
     * 删除所有
     *
     * @param footYysSearchForm 条件
     * @param request           请求
     */
    @Override
    public void deleteAll(FootYysSearchForm footYysSearchForm, HttpServletRequest request) {
        if (footYysSearchForm.getSelectIds() != null) {
            String[] result = footYysSearchForm.getSelectIds().split(Constants.COMMA);
            for (String id : result) {
                this.delete(Long.parseLong(id), request);
            }
        }
    }

    /**
     * 根据用户主键删除友谊赛记录
     *
     * @param userId  用户主键
     * @param request 请求
     */
    @Override
    public void deleteByUserId(Long userId, HttpServletRequest request) {
        //友谊赛
        FootYys yys = findYysByUserId(userId);
        if (yys != null) {
            this.delete(yys.getId(), request);
        }
    }
}
